<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>备份你的集群 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/backing-up-your-cluster.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/backing-up-your-cluster.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/backing-up-your-cluster.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/backing-up-your-cluster.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="administration.html">管理、监控和部署</a></span>
»
<span class="breadcrumb-link"><a href="post_deploy.html">部署后</a></span>
»
<span class="breadcrumb-node">备份你的集群</span>
</div>
<div class="navheader">
<span class="prev">
<a href="_rolling_restarts.html">« 滚动重启</a>
</span>
<span class="next">
<a href="_restoring_from_a_snapshot.html">从快照恢复 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="backing-up-your-cluster"></a>备份你的集群<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h2>
</div></div></div>
<p>无论使用哪个存储数据的软件，定期备份数据都是很重要的。
Elasticsearch 副本在运行时提供了高可用性；它们让你可以容忍零星的节点丢失而不会中断服务。</p>

<p>但是，副本并不能提供对灾难性故障的保护。

为此，你需要的是对集群真正的备份 —— 一个完整的副本，以防出现问题。</p>

<p>要备份你的集群，你可以使用 <code class="literal">snapshot</code> API。

它会取得集群的当前状态和数据然后保存到一个共享仓库里。

这个备份过程是"智能"的。

第一个快照是数据的一个完整拷贝，但所有后续的快照都保存现有快照和新数据之间的<em>增量</em>。

随着你不时的对数据进行快照，备份数据也在增量的添加和删除。

这意味着后续备份会大大加快，因为它们传输的数据量少得多。</p>

<p>要使用这个功能，必须首先创建一个保存数据的仓库。有多个仓库类型可以供你选择：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
共享文件系统，比如 NAS
</li>
<li class="listitem">
Amazon S3
</li>
<li class="listitem">
HDFS (Hadoop 分布式文件系统)
</li>
<li class="listitem">
Azure Cloud
</li>
</ul>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_创建仓库"></a>创建仓库<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h3>
</div></div></div>
<p>让我们创建一个共享文件系统仓库：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT _snapshot/my_backup <a id="CO309-1"></a><i class="conum" data-value="1"></i>
{
    "type": "fs", <a id="CO309-2"></a><i class="conum" data-value="2"></i>
    "settings": {
        "location": "/mount/backups/my_backup" <a id="CO309-3"></a><i class="conum" data-value="3"></i>
    }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO309-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>给我们的仓库取一个名字，在本例中它叫<code class="word">my_backup</code>。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO309-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>我们指定仓库的类型应该是一个共享文件系统(fs)。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO309-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>最后，我们提供一个已挂载的设备作为目的地址。</p>
</td>
</tr>
</table>
</div>

<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
 必须确保集群种的所有节点都可以访问到这个共享文件系统路径。
</p>
</div>
</div>

<p>这将在挂载点创建仓库和所需的元数据。
还有一些其他的选项你可能想要配置的，这些取决于你的节点、网络和仓库位置：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">max_snapshot_bytes_per_sec</code>
</span>
</dt>
<dd>
当快照数据进入仓库时，这个参数控制这个过程的限流。默认是每秒<code class="literal">20mb</code>。
</dd>
<dt>
<span class="term">
<code class="literal">max_restore_bytes_per_sec</code>
</span>
</dt>
<dd>
当从仓库恢复数据时，这个参数控制恢复时限流多少，以确保网络不会被占满。默认是每秒<code class="literal">20mb</code>。
</dd>
</dl>
</div>
<p>假设我们有一个非常快的网络，而且对额外的流量也很 OK，那我们可以增加这些默认值：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">POST _snapshot/my_backup/ <a id="CO310-1"></a><i class="conum" data-value="1"></i>
{
    "type": "fs",
    "settings": {
        "location": "/mount/backups/my_backup",
        "max_snapshot_bytes_per_sec" : "50mb", <a id="CO310-2"></a><i class="conum" data-value="2"></i>
        "max_restore_bytes_per_sec" : "50mb"
    }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO310-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>注意我们用的是 <code class="literal">POST</code> 而不是 <code class="literal">PUT</code> 。这会更新已有仓库的设置。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO310-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>然后添加新的设置。</p>
</td>
</tr>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_快照所有打开的索引"></a>快照所有打开的索引 (Snapshotting All Open Indices)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h3>
</div></div></div>
<p>一个仓库可以包含多个快照。每个快照跟一系列索引相关（比如所有索引，一部分索引，或者单个索引）。当创建快照的时候，你指定你感兴趣的索引然后给快照取一个唯一的名字。</p>

<p>让我们从最基础的快照命令开始：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT _snapshot/my_backup/snapshot_1</pre>
</div>

<p>这个会备份所有打开的索引到 <code class="word">my_backup</code> 仓库下一个命名为 <code class="word">snapshot_1</code> 的快照里。

这个调用会立刻返回，然后快照会在后台运行。</p>

<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>通常你会希望你的快照作为后台进程运行，不过有时候你会希望在你的脚本中一直等待到完成。
这可以通过添加一个 <code class="literal">wait_for_completion</code> 标记实现：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true</pre>
</div>
<p>这会阻塞调用直到快照完成。注意大型快照会花很长时间才返回。</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_快照指定索引"></a>快照指定索引 (Snapshotting Particular Indices)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h3>
</div></div></div>
<p>默认行为是备份所有打开的索引。

不过如果你在用 Marvel，你不是真的想要把所有诊断相关的 <code class="literal">.marvel</code> 索引也备份起来。

可能你就压根没那么大空间备份所有数据。</p>

<p>这种情况下，可以在快照集群的时候指定备份哪些索引：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT _snapshot/my_backup/snapshot_2
{
    "indices": "index_1,index_2"
}</pre>
</div>
<p>这个快照命令只会备份<code class="word">index1</code>和<code class="word">index2</code>了。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_列出快照相关的信息"></a>列出快照相关的信息<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h3>
</div></div></div>
<p>一旦你开始在你的仓库里积攒起快照了，你可能会忘记里面各自的细节了 —— 特别是当快照是按照时间划分命名的时候（比如，<code class="word">backup_2014_10_28</code>）。</p>

<p>要获得单个快照的信息，直接对仓库和快照名发起一个<code class="literal">GET</code>请求：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET _snapshot/my_backup/snapshot_2</pre>
</div>
<p>这将返回一个包括快照的各种信息的小的响应：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
   "snapshots": [
      {
         "snapshot": "snapshot_1",
         "indices": [
            ".marvel_2014_28_10",
            "index1",
            "index2"
         ],
         "state": "SUCCESS",
         "start_time": "2014-09-02T13:01:43.115Z",
         "start_time_in_millis": 1409662903115,
         "end_time": "2014-09-02T13:01:43.439Z",
         "end_time_in_millis": 1409662903439,
         "duration_in_millis": 324,
         "failures": [],
         "shards": {
            "total": 10,
            "failed": 0,
            "successful": 10
         }
      }
   ]
}</pre>
</div>
<p>要获取一个仓库中所有快照的完整列表，使用 <code class="literal">_all</code> 占位符替换掉具体的快照名称：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET _snapshot/my_backup/_all</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_删除快照"></a>删除快照<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h3>
</div></div></div>
<p>最后，我们需要一个命令来删除所有不再有用的旧快照。
只要对仓库/快照名称发一个简单的<code class="literal">DELETE</code> HTTP 调用：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">DELETE _snapshot/my_backup/snapshot_2</pre>
</div>
<p>用 API 删除快照很重要，而不能用其他机制（比如手动删除，或者用 S3 上的自动清除工具）。

因为快照是增量的，有可能很多快照依赖于旧的段。<code class="literal">delete</code> API 知道哪些数据还在被最近的快照使用，只删除不再被使用的段。</p>
<p>但是，如果你手动删除文件，你将会面临备份严重损坏的风险，因为你正在删除仍在使用中的数据。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_监控快照进度"></a>监控快照进度<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h3>
</div></div></div>
<p><code class="literal">wait_for_completion</code> 标记提供了一种基础的监控形式，但哪怕只是对一个中等规模的集群做快照或恢复的时候，它都真的不够用。</p>

<p>另外两个 API 会给你有关快照状态更详细的信息。
首先你可以给快照 ID 执行一个 <code class="literal">GET</code>，就像我们之前获取一个特定快照的信息时做的那样：</p>

<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET _snapshot/my_backup/snapshot_3</pre>
</div>
<p>如果你调用这个命令的时候快照还在进行中，你会看到它什么时候开始，运行了多久等等信息。
不过要注意，这个 API 用的是与快照机制相同的线程池。
如果你在快照非常大的分片，状态更新的间隔会很大，因为 API 在竞争相同的线程池资源。</p>
<p>更好的方案是轮循 <code class="literal">_status</code> API：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET _snapshot/my_backup/snapshot_3/_status</pre>
</div>
<p><code class="literal">_status</code> API 立刻返回，并给出详细得多的统计输出：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
   "snapshots": [
      {
         "snapshot": "snapshot_3",
         "repository": "my_backup",
         "state": "IN_PROGRESS", <a id="CO311-1"></a><i class="conum" data-value="1"></i>
         "shards_stats": {
            "initializing": 0,
            "started": 1, <a id="CO311-2"></a><i class="conum" data-value="2"></i>
            "finalizing": 0,
            "done": 4,
            "failed": 0,
            "total": 5
         },
         "stats": {
            "number_of_files": 5,
            "processed_files": 5,
            "total_size_in_bytes": 1792,
            "processed_size_in_bytes": 1792,
            "start_time_in_millis": 1409663054859,
            "time_in_millis": 64
         },
         "indices": {
            "index_3": {
               "shards_stats": {
                  "initializing": 0,
                  "started": 0,
                  "finalizing": 0,
                  "done": 5,
                  "failed": 0,
                  "total": 5
               },
               "stats": {
                  "number_of_files": 5,
                  "processed_files": 5,
                  "total_size_in_bytes": 1792,
                  "processed_size_in_bytes": 1792,
                  "start_time_in_millis": 1409663054859,
                  "time_in_millis": 64
               },
               "shards": {
                  "0": {
                     "stage": "DONE",
                     "stats": {
                        "number_of_files": 1,
                        "processed_files": 1,
                        "total_size_in_bytes": 514,
                        "processed_size_in_bytes": 514,
                        "start_time_in_millis": 1409663054862,
                        "time_in_millis": 22
                     }
                  },
                  ...</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO311-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>一个正在运行的快照会显示<code class="literal">IN_PROGRESS</code>状态。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO311-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>这个特定的快照还有一个分片在传输（另外四个已经完成）。</p>
</td>
</tr>
</table>
</div>
<p>响应包括快照的总体状况，但也深入到每个索引和每个分片的统计。
这为你提供了有关快照进展的非常详细的视图。
分片可以处于不同的完成状态：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">INITIALIZING</code>
</span>
</dt>
<dd>
分片正在检查集群状态，看看自己是否可以被快照。这个通常很快。
</dd>
<dt>
<span class="term">
<code class="literal">STARTED</code>
</span>
</dt>
<dd>
数据正在被传输到仓库。
</dd>
<dt>
<span class="term">
<code class="literal">FINALIZING</code>
</span>
</dt>
<dd>
数据传输完成；分片现在在发送快照元数据。
</dd>
<dt>
<span class="term">
<code class="literal">DONE</code>
</span>
</dt>
<dd>
快照完成！
</dd>
<dt>
<span class="term">
<code class="literal">FAILED</code>
</span>
</dt>
<dd>
快照处理的过程中遇到了错误，这个分片/索引/快照不可能完成了。
检查你的日志以获取更多信息。
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_取消一个快照"></a>取消一个快照<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/520_Post_Deployment/50_backup.asciidoc">edit</a>
</h3>
</div></div></div>
<p>最后，你可能想取消一个快照或恢复。

因为这些是长期运行的进程，执行操作的时候一个拼写错误或者失误就需要花很长时间去解决 —— 同时还会耗尽宝贵的资源。</p>

<p>要取消一个快照，只需在快照正在进行时删除它：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">DELETE _snapshot/my_backup/snapshot_3</pre>
</div>
<p>这个会中断快照进程。然后从仓库里删除进行了一半的快照。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="_rolling_restarts.html">« 滚动重启</a>
</span>
<span class="next">
<a href="_restoring_from_a_snapshot.html">从快照恢复 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>